package com.crazymakercircle.designmodel.masterworker;

import com.crazymakercircle.util.ThreadUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * 假设一个场景, 需要执行N个任务，将这些任务的结果进行累加求和，如果任务太多，
 * 可以采用Master-Worker模式实现。Master持有workerCount个Worker，并且负责接收任务然后分发给Worker，
 * 然后在回调函数中对Worker的结果进行归并求和。
 */
@Slf4j
public class MasterWorkerTest {
    public static void main(String[] args) {
        //创建Master ，包含四个worker，并启动master的执行线程
        Master<SimpleTask, Integer> master = new Master<>(4);

        //定期向master提交任务
        ThreadUtil.scheduleAtFixedRate(() -> master.submit(new SimpleTask()), 10, TimeUnit.SECONDS);

        //定期从master提取结果
        ThreadUtil.scheduleAtFixedRate(master::printResult, 5, TimeUnit.SECONDS);
    }

    //简单任务
    static class SimpleTask extends Task<Integer> {
        @Override
        protected Integer doExecute() {
            log.info("tttt");
            return getId();
        }
    }

}
